package com.example.mqttclient;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.example.mqttclient.mqtt.MqttService;
import org.eclipse.paho.client.mqttv3.MqttException;

// DevicesDemoActivity 类，继承自 AppCompatActivity 并实现 MqttService.MqttEventCallBack 和 CompoundButton.OnCheckedChangeListener 接口
// 该 Activity 用于模拟设备控制和数据显示，处理 MQTT 消息接收和设备开关状态变化
public class DevicesDemoActivity extends AppCompatActivity implements MqttService.MqttEventCallBack, CompoundButton.OnCheckedChangeListener {

    // 用于显示连接状态的 TextView
    private TextView connectState;
    // 用于显示温度数据的 TextView
    private TextView tempData;
    // 用于显示湿度数据的 TextView
    private TextView humiData;
    // 用于显示 PM2.5 数据的 TextView
    private TextView pm25Data;
    // 用于控制设备开关的 Switch
    private Switch deviceSwitch;
    // MqttService 的绑定对象，用于调用 MqttService 中的方法
    private MqttService.MqttBinder mqttBinder;
    // 用于日志记录的标签
    private String TAG = "DevicesDemoActivity";
    // 定义 ServiceConnection，用于监听 MqttService 服务的连接和断开
    private ServiceConnection connection = new ServiceConnection() {
        // 当服务连接成功时调用
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            // 将传入的 IBinder 转换为 MqttService.MqttBinder
            mqttBinder = (MqttService.MqttBinder) iBinder;
            // 设置 MqttService 的事件回调对象为当前 DevicesDemoActivity
            mqttBinder.setMqttEventCallback(DevicesDemoActivity.this);
            // 判断 MqttService 是否已连接
            if (mqttBinder.isConnected()) {
                if (connectState != null) {
                    connectState.setText("已连接");
                }
                subscribeTopics();
            } else {
                if (connectState != null) {
                    connectState.setText("未连接");
                }
            }
        }

        // 当服务断开连接时调用
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            // 此处暂时不做处理
        }
    };

    // 当 Activity 创建时调用
    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置 Activity 的布局为 activity_devices_demo
        setContentView(R.layout.activity_devices_demo);
        // 通过 findViewById 获取布局文件中 id 为 connect_state 的 TextView
        connectState = findViewById(R.id.connect_state);
        // 通过 findViewById 获取布局文件中 id 为 temp_data 的 TextView
        tempData = findViewById(R.id.temperature_value);
        // 通过 findViewById 获取布局文件中 id 为 humi_data 的 TextView
        humiData = findViewById(R.id.humidity_value);
        // 通过 findViewById 获取布局文件中 id 为 pm25_data 的 TextView
        pm25Data = findViewById(R.id.pm_value);
        // 通过 findViewById 获取布局文件中 id 为 device_switch 的 Switch
        deviceSwitch = findViewById(R.id.curtain_switch);
        // 为 deviceSwitch 设置状态改变监听器，即当前 Activity
        deviceSwitch.setOnCheckedChangeListener(this);
        // 创建启动 MqttService 服务的 Intent
        Intent mqttServiceIntent = new Intent(this, MqttService.class);
        // 绑定 MqttService 服务，BIND_AUTO_CREATE 表示如果服务未运行则自动创建
        bindService(mqttServiceIntent, connection, Context.BIND_AUTO_CREATE);
    }

    // 订阅主题的方法
    void subscribeTopics() {
        try {
            mqttBinder.subscribe("/device/temp");
            mqttBinder.subscribe("/device/humi");
            mqttBinder.subscribe("/device/pm25");
            Log.d(TAG, "主题订阅成功");
        } catch (MqttException e) {
            e.printStackTrace();
            // 将Lambda表达式替换为传统匿名内部类形式
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(DevicesDemoActivity.this, "主题订阅失败", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    // 取消订阅主题的方法
    void unSubscribeTopics() {
        try {
            mqttBinder.unSubscribe("/device/temp");
            mqttBinder.unSubscribe("/device/humi");
            mqttBinder.unSubscribe("/device/pm25");
            Log.d(TAG, "主题取消订阅成功");
        } catch (MqttException e) {
            e.printStackTrace();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(DevicesDemoActivity.this, "主题取消订阅失败", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    // 当 MQTT 连接成功时调用
    @Override
    public void onConnectSuccess() {
        subscribeTopics();
        if (connectState != null) {
            connectState.setText("已连接");
        }
    }

    // 当 MQTT 连接出错时调用
    @Override
    public void onConnectError(String error) {
        Log.d(TAG, "onConnectError: " + error);
        if (connectState != null) {
            connectState.setText("未连接");
        }
    }

    // 当 MQTT 消息发布完成时调用
    @Override
    public void onDeliveryComplete() {
        Log.d(TAG, "publish ok");
    }

    // 当接收到 MQTT 消息时调用
    @Override
    public void onMqttMessage(String topic, String message) {
        // 根据不同的主题更新相应的数据显示
        if (tempData != null && "/device/temp".equals(topic)) {
            tempData.setText(message);
        }
        if (humiData != null && "/device/humi".equals(topic)) {
            humiData.setText(message);
        }
        if (pm25Data != null && "/device/pm25".equals(topic)) {
            pm25Data.setText(message);
        }
    }

    // 当设备开关状态改变时调用
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
        try {
            if (isChecked) {
                mqttBinder.publishMessage("/device/switch", "on");
                Log.d(TAG, "设备开关打开，消息已发布");
            } else {
                mqttBinder.publishMessage("/device/switch", "off");
                Log.d(TAG, "设备开关关闭，消息已发布");
            }
        } catch (MqttException e) {
            e.printStackTrace();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(DevicesDemoActivity.this, "消息发布失败", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    // 当 Activity 重新启动时调用
    @Override
    protected void onRestart() {
        super.onRestart();
        // 判断 MqttService 是否已连接
        if (mqttBinder != null && mqttBinder.isConnected()) {
            if (connectState != null) {
                connectState.setText("已连接");
            }
            subscribeTopics();
        } else {
            if (connectState != null) {
                connectState.setText("未连接");
            }
        }
    }

    // 当 Activity 停止时调用
    @Override
    protected void onStop() {
        super.onStop();
        unSubscribeTopics();
    }

    // 当 Activity 销毁时调用
    @Override
    protected void onDestroy() {
        // 解绑 MqttService 服务
        unbindService(connection);
        super.onDestroy();
    }
}